package com.example.designpattern.creational.factory.simple_factory;

import com.example.designpattern.creational.factory.common.product.fruit.*;

/**
 *
 */
public class FruitFactory {
    public Fruit create(String type) {
        switch (type) {

            // 工厂的好处一：降低耦合
            // 工厂是为了减少类与类之间的耦合，让调用者尽可能少的和其他类打交道。
            // 用简单工厂模式，我们只需要知道 FruitFactory，无需知道 Apple 、Pear 类，很容易看出耦合度降低了。

            // 好处二：大大减少代码重复
            // 将构建过程封装的好处不仅可以降低耦合，如果某个产品构造方法相当复杂，使用工厂模式可以大大减少代码重复。
            // 调用者的代码则完全不需要变化，而且调用者不需要在每次需要苹果时，自己去构建苹果种子、阳光、水分以获得苹果。

            // 苹果的生产过程再复杂，也只是工厂的事。这就是封装的好处，

            // 假如某天科学家发明了让苹果更香甜的肥料，要加入苹果的生产过程中的话，也只需要在工厂中修改，调用者完全不用关心。
            case "苹果":
                //        return new Apple();

                // 当构建苹果的过程变复杂时，只需要修改苹果创建工厂即可
                // 如果是直接new的话，就需要在每个new的地方都修改代码，形成代码重复且修改艰难
                AppleSeed appleSeed = new AppleSeed();
                Sunlight sunlight = new Sunlight();
                Water water = new Water();
                return new Apple(appleSeed, sunlight, water);
            case "梨子":
                return new Pear();
            default:
                throw new IllegalArgumentException("暂时没有这种水果");
        }
    }
}